package com.linkai.JUC._14_jmm;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Description: volatile 关键字（不保证原子性）
 *                加了 volatile 关键字，num依旧不能加到 20000
 * @Author: 林凯
 * @Date: 2021/10/25 22:25
 */
public class JMMDemo02 {

    // 加上 volatile 关键字也没有用，不能保证原子性
    private volatile static int num = 0;

    // 或者使用原子类
    private static AtomicInteger atomicInteger = new AtomicInteger(0);

    //加一个 synchronize 即可
    public static void add() {
        num++;  // 不是原子性操作
        atomicInteger.getAndIncrement();  // AtomicInteger + 1 方法
    }

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 20; i++) {
            new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    add();
                }
            }).start();
        }

        while (Thread.activeCount() > 2) {  // main线程，gc 线程
            Thread.yield();
        }

        // 保证执行输出时，前面的线程已经执行完了
        System.out.println(num);
        System.out.println(atomicInteger);
    }
}
